package com.knowledge.review.designPatterns.behavioralpattern.observermode;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Observable;
import java.util.Observer;

// 具体的被观察者(公众号)
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
public class Subject1 extends Observable {
    // 公众号的名字
    private String name;

    // 公众号发布消息
    public void notifyMessage(String message) {
        System.out.println(this.name + "公众号发布消息:" + message + "请关注用户留意接收!");
        super.setChanged();
        super.notifyObservers(message);
    }
}

@AllArgsConstructor
class WeixinUser1 implements Observer {
    private String name;

    /**
     * @param o   被观察者
     * @param arg 被观察者带过来的参数，此例子中是公众号发布的消息
     */
    @Override
    public void update(Observable o, Object arg) {
        System.out.println(name + "关注了公众号(被观察者):" + ((Subject1) o).getName() + ",接收到消息:" + arg);
    }
}

class Test1{
    // 测试
    public static void main(String[] args){
        WeixinUser1 user1 = new WeixinUser1("张三");
        WeixinUser1 user2 = new WeixinUser1("李四");
        WeixinUser1 user3 = new WeixinUser1("王五");
        Subject1 subject = new Subject1("演唱会消息发布");
        subject.addObserver(user1);
        subject.addObserver(user2);
        subject.addObserver(user3);
        subject.notifyMessage("薛之谦演唱会要来到广州啦!");
        // 返回结果
        // 演唱会消息发布公众号发布消息:薛之谦演唱会要来到广州啦!请关注用户留意接收!
        // 王五关注了公众号(被观察者):演唱会消息发布,接收到消息:薛之谦演唱会要来到广州啦!
        // 李四关注了公众号(被观察者):演唱会消息发布,接收到消息:薛之谦演唱会要来到广州啦!
        // 张三关注了公众号(被观察者):演唱会消息发布,接收到消息:薛之谦演唱会要来到广州啦!
    }
}